TOP

LibreOffice Calc के लिए फ़ज़ी लुकअप

FUZZYLOOKUP() विवरण

हम सभी सुप्रसिद्ध VLOOKUP() फ़ंक्शन को जानते हैं जो हमें विभिन्न तालिकाओं से डेटा को संयोजित करने में मदद करता है। हालाँकि, इस फ़ंक्शन में एक महत्वपूर्ण खामी है - यह समान मानों को संयोजित नहीं कर सकता है, अर्थात, यदि शब्द में कोई त्रुटि है, तो कोई मिलान नहीं होगा।

अनुमानित मानों को संयोजित करने में सक्षम होने के लिए, हम अपना स्वयं का फ़ंक्शन बना सकते हैं। चलिए इसे FuzzyLookup() कहते हैं।

आइए कल्पना करें कि हमारे पास दो सूचियाँ हैं। दोनों में लगभग समान तत्व हैं, लेकिन उन्हें थोड़ा अलग तरीके से लिखा जा सकता है। कार्य पहली सूची में प्रत्येक तत्व के लिए दूसरी सूची से सबसे समान तत्व ढूंढना है, अर्थात। निकटतम अधिकतम समान पाठ के लिए खोज लागू करें।

ऐसे में बड़ा सवाल यह है कि "समानता" की कसौटी पर क्या विचार किया जाए। केवल मेल खाने वाले वर्णों की संख्या? क्या लगातार मैचों की संख्या है? क्या कैरेक्टर केस या रिक्त स्थान पर विचार किया जाना चाहिए? किसी वाक्यांश में शब्दों की भिन्न-भिन्न व्यवस्था का क्या करें? कई विकल्प हैं और कोई एक समाधान नहीं है - प्रत्येक स्थिति के लिए कोई न कोई स्थिति दूसरों से बेहतर होगी।

हमारे मामले में, हम सबसे सरल विकल्प लागू करते हैं - वर्ण मिलानों की अधिकतम संख्या के आधार पर खोजें। यह सही नहीं है, लेकिन अधिकांश स्थितियों के लिए यह बहुत अच्छा काम करता है।


StarBASIC फ़ंक्शन के लिए कोड FuzzyLookup

जमा करना फ़ंक्शन FuzzyLookup , मेनू खोलें Tools - Macros - Edit Macros... , चुनना Module1 और निम्नलिखित पाठ को मॉड्यूल में कॉपी करें:

  1. Function FuzzyLOOKUP(LookupValue As String, SrcTable As VariantOptional SimThreshold As SingleAs String   
  2.   ' moonexcel.com.ua   
  3.   Dim Str       As String    
  4.   Dim CellArray As Variant  
  5.   Dim StrArray  As Variant  
  6.     
  7.   If IsMissing(SimThreshold) Then SimThreshold  = 0  
  8.     
  9.   Str      = LCase(LookupValue)  
  10.   StrArray = Split(Str)  
  11.   StrExt   = UBound(StrArray)    
  12.               
  13.   For Each Cell In SrcTable  
  14.                             
  15.     CellArray = Split(LCase(Cell))  
  16.     CellExt   = UBound(CellArray)             
  17.     CellRate  = 0  
  18.       
  19.     ' हम खोज वाक्यांश में प्रत्येक शब्द की जाँच करते हैं   
  20.     For x = 0 To StrExt   
  21.       
  22.       StrWord = StrArray(x)     
  23.       If Len(StrWord) = 0 Then GoTo continue_x  
  24.       MaxStrWordRate = 0  
  25.         
  26.       ' हम मानों की मूल तालिका से अगले सेल में प्रत्येक शब्द की जांच करते हैं   
  27.       For i = 0 To CellExt  
  28.           
  29.         CellWord = CellArray(i)  
  30.         If Len(CellWord) = 0 Then GoTo continue_i  
  31.      
  32.         FindCharNum = OccurrenceNum(StrWord, CellWord)  
  33.         StrWordRate = FindCharNum / Max(Len(StrWord),Len(CellWord))  
  34.           
  35.         If StrWordRate > MaxStrWordRate Then MaxStrWordRate = StrWordRate  
  36.         continue_i:  
  37.       Next i              
  38.                           
  39.       CellRate = CellRate + MaxStrWordRate  
  40.       continue_x:  
  41.     Next x                 
  42.           
  43.     ' हम सबसे अच्छा मेल रखते हैं   
  44.     If CellRate > MaxCellRate Then      
  45.       MaxCellRate = CellRate  
  46.       BestCell    = Cell            
  47.          
  48.       FindCharNum = OccurrenceNum(Str, Cell)  
  49.       SimRate     = FindCharNum / Max(Len(Str),Len(Cell))  
  50.     End If         
  51.           
  52.   Next Cell  
  53.       
  54.   IF SimRate >= SimThreshold Then   
  55.     IF SimThreshold = -1 Then  
  56.       ReturnValue = BestCell + " (" + Format(SimRate, "0.00") + ")"  
  57.     ElseIf SimThreshold = -2 Then  
  58.       ReturnValue = Format(SimRate, "0.00")  
  59.     Else  
  60.       ReturnValue = BestCell  
  61.     End If  
  62.   Else   
  63.     ReturnValue = ""  
  64.   End If      
  65.     
  66.   FuzzyLOOKUP = ReturnValue  
  67. End Function  
  68.   
  69.   
  70. Function OccurrenceNum(ByVal SourceString As StringByVal TargetString As String)  
  71.   For i = 1 To Len(SourceString)                                          
  72.     ' हम प्रत्येक प्रतीक की घटना की तलाश कर रहे हैं   
  73.     Position = InStr(1, TargetString, Mid(SourceString, i, 1), 1)    
  74.     ' हम संयोगों का काउंटर बढ़ाते हैं   
  75.     If Position > 0 Then         
  76.       Count = Count + 1  
  77.       ' पाए गए प्रतीक को हटा दें   
  78.       TargetString = Left(TargetString, Position - 1) + Right(TargetString, Len(TargetString) - Position)     
  79.     End If  
  80.   Next i      
  81.   OccurrenceNum = Count  
  82. End Function  
  83.   
  84.   
  85. Function Max(ByVal value1 As VariantByVal value2 As Variant)    
  86.   If value1 > value2 Then  
  87.     Result = value1  
  88.   Else  
  89.     Result = value2  
  90.   End If  
  91.   Max = Result  
  92. End Function  

अगला, बंद करें Macro Editor और वर्कशीट पर वापस लौटें LibreOffice Calc - अब आप हमारी नई सुविधा का उपयोग कर सकते हैं FuzzyLookup() .

एक्सटेंशन का उपयोग करना

उसके बाद, यह फ़ंक्शन उन सभी फ़ाइलों में उपलब्ध होगा जो LibreOffice Calc में खोली जाएंगी।